用于Python数据结构的可扩展JSON编码器。
默认支持以下对象和类型:
Python
JSON
dict
object -- 对象
list, tuple
array
str
string
int, float, int 和 float 派生的枚举
number
True
true
False
false
None
null
在 3.4 版本发生变更: 添加了对 int 和 float 派生的枚举类的支持
要将其扩展至识别其他对象,需要子类化并实现 default(),如果可能还要实现另一个返回 o 的可序列化对象的方法,否则它应当调用超类实现 (来引发 TypeError)。
如果 skipkeys 为假值(默认),则当尝试对非 str, int, float 或 None 的键进行编码时将会引发 TypeError。 如果 skipkeys 为真值,这些条目将被直接跳过。
如果 ensure_ascii 是 true (即默认值),输出保证将所有输入的非 ASCII 字符转义。如果 ensure_ascii 是 false,这些字符会原样输出。
如果 check_circular 为真值(默认),那么列表、字典和自定义的已编码对象将在编码期间进行循环引用检查以防止无限递归 (无限递归会导致 RecursionError)。 在其他情况下,将不会进行这种检查。
如果 allow_nan 为 true (默认),那么 NaN , Infinity ,和 -Infinity 进行编码。此行为不符合 JSON 规范,但与大多数的基于 Javascript 的编码器和解码器一致。否则,它将是一个 ValueError 来编码这些浮点数。
如果 sort_keys 为 true (默认为: False ),那么字典的输出是按照键排序;这对回归测试很有用,以确保可以每天比较 JSON 序列化。
如果 indent 是一个非负整数或者字符串,那么 JSON 数组元素和对象成员会被美化输出为该值指定的缩进等级。 如果缩进等级为零、负数或者 "",则只会添加换行符。 None (默认值) 选择最紧凑的表达。 使用一个正整数会让每一层缩进同样数量的空格。 如果 indent 是一个字符串 (比如 "\t"),那个字符串会被用于缩进每一层。
在 3.2 版本发生变更: 现允许使用字符串作为 indent 而不再仅仅是整数。
当被指定时,separators 应当是一个 (item_separator, key_separator) 元组。当 indent 为 None 时,默认值取 (', ', ': '),否则取 (',', ': ')。为了得到最紧凑的 JSON 表达式,你应该指定其为 (',', ':') 以消除空白字符。
在 3.4 版本发生变更: 现当 indent 不是 None 时,采用 (',', ': ') 作为默认值。
当 default 被指定时,其应该是一个函数,每当某个对象无法被序列化时它会被调用。它应该返回该对象的一个可以被 JSON 编码的版本或者引发一个 TypeError。如果没有被指定,则会直接引发 TypeError。
在 3.6 版本发生变更: 所有形参现在都是 仅限关键字参数。
default(o)¶在子类中实现这种方法使其返回 o 的可序列化对象,或者调用基础实现(引发 TypeError )。
例如,要支持任意的迭代器,你可以这样实现 default():
def default(self, o):try:iterable = iter(o)except TypeError:passelse:return list(iterable)# 让基类的 default 方法引发 TypeErrorreturn super().default(o)encode(o)¶返回 Python o 数据结构的 JSON 字符串表达方式。例如:
>>> json.JSONEncoder().encode({"foo": ["bar", "baz"]})'{"foo": ["bar", "baz"]}'iterencode(o)¶编码给定对象 o ,并且让每个可用的字符串表达方式。例如:
for chunk in json.JSONEncoder().iterencode(bigobject):mysocket.write(chunk)